from django.shortcuts import render
from django.http import JsonResponse
from django.views import View
# Paginator分页器
# EmptyPage一个空页异常
from django.core.paginator import Paginator, EmptyPage
from goods.models import SKU
from goods.utils import get_breadcrumb
# Create your views here.


# 商品列表
class ListView(View):

    # GET + /list/<分类id>/<skus>/
    def get(self, request, category_id):
        # 1、提取参数
        page = request.GET.get('page') # 1
        page_size = request.GET.get('page_size') # 5
        ordering = request.GET.get('ordering') # -create_time
        # 2、校验参数
        # 略....（不是用户输入数据，且不是写入库的数据）
        # 3、业务数据处理 —— 过滤、排序、分页，构建响应参数返回
        # 3.1、过滤、排序查询
        skus = SKU.objects.filter(category_id=category_id).order_by(ordering)
        # 3.2、分页
        # TODO: 使用django的分页器来分页
        # (1)、实例化分页器对象
        paginator = Paginator(skus, per_page=page_size)
        # (2)、找对象里面的方法实现获取指定页数据
        try:
            cur_page = paginator.page(page) # 返回一个Page对象，该对象中封装了当前页数据
        except EmptyPage as e:
            return JsonResponse({'code': 400, 'errmsg': '当前页不存在'})

        # 3.3、构造响应参数
        sku_list = []
        for sku in cur_page:
            # sku是当前页中每一个SKU对象
            sku_list.append({
                'id': sku.id,
                'default_image_url':  sku.default_image.url,
                'name': sku.name,
                'price': sku.price
            })

        count = paginator.num_pages # 总页数
        breadcrumb = get_breadcrumb(category_id)

        # 4、构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'breadcrumb': breadcrumb,
            'list': sku_list,
            'count': count
        })



# 热销商品
class HotGoodsView(View):

    # GET + /hot/<分类id>/
    def get(self, request, category_id):
        # 1、提取参数
        # 2、校验参数
        # 3、业务数据处理 —— 根据销量降序排列，返回前几个热销商品
        skus = SKU.objects.filter(is_launched=True).order_by('-sales')
        # 取前2个热销商品构造响应参数
        res_skus = skus[:2] # 细节：查询集/列表切片不会抛出异常
        hot_skus = []
        for sku in res_skus:
            hot_skus.append({
                'id': sku.id,
                'default_image_url': sku.default_image.url,
                'name': sku.name,
                'price': sku.price
            })

        # 4、构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'hot_skus': hot_skus
        })


# SearchView --> haystack提供的写好了的一个视图，对应的接口定义就是：GET + /search/?q=搜索词
# from haystack.views import SearchView
# # SKU商品搜索
# class MySearchView(SearchView):
#
#     # 重写create_response函数，构建一个json响应
#     def create_response(self):
#
#         # self.get_context()功能：和es交互，根据搜索次检索出结果
#         context = self.get_context()
#
#         results = context['page'].object_list # results = [SearchResult().....]
#         data_list = []
#         # 构造响应参数
#         for result in results:
#             # result: SearchResult()对象
#             sku = result.object # SKU对象
#             data_list.append({
#                 'id': sku.id,
#                 'name': sku.name,
#                 'price': sku.price,
#                 'default_image_url': sku.default_image.url,
#                 'searchKey': context['query'],
#                 'page_size': context['paginator'].per_page,
#                 'count': context['paginator'].count
#             })
#
#         return JsonResponse(data_list, safe=False)












